﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Mail;

namespace TangoFamilyAndGuide.RN
{
    public class Housing
    {
        public static List<Entidades.Housing> LeerListaHousingsPorUsuario(Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            return db.LeerListaHousingsPorUsuario();
        }
        public static void Leer(Entidades.Housing Housing, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            db.Leer(Housing);
        }
        public static void Crear(out int IdHousing, Entidades.Housing Housing, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            Housing.WF.Estado = "PendingConf";
            IdHousing = db.Crear(Housing);
        }
        public static void Modificar(Entidades.Housing HousingActual, Entidades.Housing Housing, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            db.Modificar(HousingActual, Housing);
        }
        public static void CambiarEstado(Entidades.Housing Housing, string Evento, string Estado, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            db.CambiarEstado(Housing, Evento, Estado);
            Housing.WF.Estado = Estado;
        }
        public static Entidades.Housing ObtenerCopia(Entidades.Housing Desde)
        {
            Entidades.Housing hasta = new Entidades.Housing();
            hasta.Id = Desde.Id;
            hasta.Descripcion = Desde.Descripcion;
            hasta.Pais = Desde.Pais;
            hasta.Provincia = Desde.Provincia;
            hasta.Localidad = Desde.Localidad;
            hasta.Direccion = Desde.Direccion;
            hasta.CodPost = Desde.CodPost;
            hasta.Contacto.Nombre = Desde.Contacto.Nombre;
            hasta.Contacto.Email = Desde.Contacto.Email;
            hasta.Contacto.Telefono = Desde.Contacto.Telefono;
            hasta.Comentarios = Desde.Comentarios;
            hasta.UltActualiz = Desde.UltActualiz;
            hasta.WF.Id = Desde.WF.Id;
            hasta.WF.Estado = hasta.WF.Estado;
            hasta.GoogleMap = Desde.GoogleMap;
            hasta.TipoDestacado = Desde.TipoDestacado;
             hasta.UltActualiz = Desde.UltActualiz;
            return hasta;
        }
        public static List<Entidades.Housing> ListaPorIdHousing(int IdHousing, bool SoloPropias, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            return db.ListaPorIdHousing(IdHousing, SoloPropias);
        }
        public static List<Entidades.Housing> ListaPorDireccion(string Direccion, bool SoloPropias, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            return db.ListaPorDireccion(Direccion, SoloPropias);
        }
        public static List<Entidades.Housing> ListaPorPais(string Pais, bool SoloPropias, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            return db.ListaPorPais(Pais, SoloPropias);
        }
        public static List<Entidades.Housing> Lista(out int CantidadFilas, int IndicePagina, int TamañoPagina, string OrderBy, string Direccion, string Pais, string Provincia, string Localidad, string Estado, string SessionID, Entidades.Sesion Sesion)
        {
            List<Entidades.Housing> listaHousing = new List<Entidades.Housing>();
            DB.Housing db = new DB.Housing(Sesion);
            if (OrderBy.Equals(String.Empty))
            {
                OrderBy = "Ranking desc, IdHousing desc";
            }
            listaHousing = db.ListaCompleta(OrderBy, Direccion, Pais, Provincia, Localidad, Estado);
            int cantidadFilas = listaHousing.Count;
            CantidadFilas = cantidadFilas;
            return db.Lista(IndicePagina, TamañoPagina, OrderBy, SessionID, listaHousing);
        }
        public static List<Entidades.Housing> ListaCompleta(out int CantidadFilas, string OrderBy, string Direccion, string Pais, string Provincia, string Localidad, string Estado, string SessionID, Entidades.Sesion Sesion)
        {
            List<Entidades.Housing> listaHousing = new List<Entidades.Housing>();
            DB.Housing db = new DB.Housing(Sesion);
            if (OrderBy.Equals(String.Empty))
            {
                OrderBy = "Ranking desc, IdHousing desc";
            }
            listaHousing = db.ListaCompleta(OrderBy, Direccion, Pais, Provincia, Localidad, Estado);
            int cantidadFilas = listaHousing.Count;
            CantidadFilas = cantidadFilas;
            return listaHousing;
        }
        public static bool ComprobarDireccionHousing(string Direccion, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            bool resp = db.ComprobarDireccionHousing(Direccion);
            return resp;
        }
        public static bool EstaReservado(int IdHousing, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            bool resp = db.EstaReservado(IdHousing);
            return resp;
        }
        public static void Reservar(Entidades.Housing Housing, string Evento, string Estado, Entidades.Sesion Sesion)
        {
            DB.Housing db = new DB.Housing(Sesion);
            int cant = db.Reservar(Housing, Evento, Estado);
            if (cant != 1)
            {
                throw new EX.Validaciones.ValorInvalido("Evento");
            }
            Housing.WF.Estado = Estado;
        }
        public static void EventoReservar(out Entidades.Evento Evento, Entidades.Housing Housing, Entidades.Sesion Sesion)
        {
            //Verificar si el usuario es administrador
            Evento = new Entidades.Evento();
            if (Housing.Estado == "Active")
            {
                Evento.Id = "Reserve";
                Evento.DescrEvento = "Reserve";
                Evento.Accion = "Reserve";
                Evento.EstadoHst = "Reserved";
            }
        }
        public static void EventoPosible(out Entidades.Evento Evento, Entidades.Housing Housing, Entidades.Sesion Sesion)
        {
            //Verificar si el usuario es administrador
            Evento = new Entidades.Evento();
            List<Entidades.Permiso> permisoAdminSITEActive = Sesion.Usuario.Permisos.FindAll(delegate(Entidades.Permiso p)
            {
                return p.TipoPermiso.Id == "AdminSITE" && p.Estado == "Active";
            });
            if (permisoAdminSITEActive.Count == 0)
            {
                if (Housing.Estado == "CanceledAdmin")
                {
                    Evento.Id = "";
                    Evento.DescrEvento = "In this state there is no event available. Only the Site Manager can intervene.";
                    Evento.Accion = "";
                    Evento.EstadoHst = "";

                }
                if (Housing.Estado == "PendingConf")
                {
                    Evento.Id = "";
                    Evento.DescrEvento = "In this state there is no event available. Only the Site Manager can intervene.";
                    Evento.Accion = "";
                    Evento.EstadoHst = "";
                }
                else if (Housing.Estado == "Active")
                {
                    Evento.Id = "Cancel";
                    Evento.DescrEvento = "Cancel";
                    Evento.Accion = "Cancel";
                    Evento.EstadoHst = "Canceled";
                }
                else if (Housing.Estado == "Canceled")
                {
                    Evento.Id = "Undo Cancel";
                    Evento.DescrEvento = "Undo Cancel";
                    Evento.Accion = "Undo Cancel";
                    Evento.EstadoHst = "Active";
                }
                else if (Housing.Estado == "Reserved")
                {
                    Evento.Id = "Undo Reserved";
                    Evento.DescrEvento = "Undo Reserved";
                    Evento.Accion = "Undo Reserved";
                    Evento.EstadoHst = "Canceled";
                }
            }
            else
            {
                if (Housing.Estado == "PendingConf")
                {
                    Evento.Id = "Confirm (Admin)";
                    Evento.DescrEvento = "Confirm (Admin)";
                    Evento.Accion = "Confirm (Admin)";
                    Evento.EstadoHst = "Active";
                }
                if (Housing.Estado == "CanceledAdmin")
                {
                    Evento.Id = "Undo Cancel (Admin)";
                    Evento.DescrEvento = "Undo Cancel (Admin)";
                    Evento.Accion = "Undo Cancel (Admin)";
                    Evento.EstadoHst = "Active";
                }
                else if (Housing.Estado == "Active")
                {
                    Evento.Id = "Cancel (Admin)";
                    Evento.DescrEvento = "Cancel (Admin)";
                    Evento.Accion = "Cancel (Admin)";
                    Evento.EstadoHst = "CanceledAdmin";
                }
                else if (Housing.Estado == "Canceled")
                {
                    Evento.Id = "Cancel (Admin)";
                    Evento.DescrEvento = "Cancel (Admin)";
                    Evento.Accion = "Cancel (Admin)";
                    Evento.EstadoHst = "CanceledAdmin";
                }
                else if (Housing.Estado == "Reserved")
                {
                    Evento.Id = "Undo Reserved";
                    Evento.DescrEvento = "Undo Reserved";
                    Evento.Accion = "Undo Reserved";
                    Evento.EstadoHst = "CanceledAdmin";
                }
            }
        }
    }
}